/*
* 数据缓存管理
* */
import 'dart:convert';
import 'package:lighthouse/index.dart';

class DictCache {
  static const String _keyStr = "dict";

  // 单例公开访问点
  factory DictCache() => _sharedInstance();

  // 静态私有成员，没有初始化
  static DictCache? _instance;

  // 私有构造函数
  DictCache._() {
    // 具体初始化代码
  }

  // 静态、同步、私有访问点
  static DictCache _sharedInstance() {
    return _instance ??= DictCache._();
  }

  late bool _isLoadData = false;

  /*当前网络数据*/
  List<Dict>? _netData;

  /*历史缓存数据*/
  List<Dict>? _cacheData;

  /*加载网络数据*/
  Future loadNetData(BuildContext context) async {
    // Global.profile.user != null
    if (!_isLoadData) {
      _isLoadData = true;
      try {
        ResponseData<List<Dict>> responseData =
            await Api(context).getDictionary();
        _netData = responseData.dataModel;
        //保存数据
        if (responseData.success) {
          Global.getPrefs().setString(_keyStr, jsonEncode(responseData.data));
        }
      } catch (e) {
        Debug.info(e.toString());
        _isLoadData = false;
        if (e is DioError) {
          //登录失败则提示
          showToast(e.response?.statusMessage ?? S.of(context).networkError);
        } else if (e is Error) {
          Debug.info(e.stackTrace.toString());
        }
      } finally {
        // 隐藏loading框
        // Navigator.of(context).pop();
      }
    }
    return _isLoadData;
  }

  /*获取当前数据*/
  List<Dict>? getCurrentData() {
    List<Dict>? mData;
    if (_netData != null) {
      // 如果有请求的数据 就返回请求的数据
      mData = _netData;
    } else if (_cacheData == null) {
      // 设置缓存数据
      var _cacheStr = Global.getPrefs().getString(_keyStr);
      if (_cacheStr != null) {
        try {
          mData = _cacheData =
              jsonDecode(_cacheStr).map<Dict>((e) => Dict.fromJson(e)).toList();
        } on Error catch (e) {
          Debug.info(e.toString());
          Debug.info(e.stackTrace.toString());
        }
      }
    } else {
      mData = _cacheData;
    }
    return mData;
  }

  /*根据code获取内容*/
  Dict? getDict(String code) {
    List<Dict>? mData = getCurrentData();
    if (mData != null) {
      for (Dict dict in mData) {
        if (dict.code == code) {
          return dict;
        }
      }
    }
    return null;
  }

  /*清楚数据*/
  void clearData() {
    _isLoadData = false;
    _netData = null;
    _cacheData = null;
    Global.getPrefs().remove(_keyStr);
  }

  static List<String>? dictToStringList(Dict? dict) {
    if (dict != null && dict.children != null && dict.children!.isNotEmpty) {
      List<String> list = [];
      for (Dict childDict in dict.children!) {
        list.add(childDict.dictValue);
      }
      return list;
    } else {
      return null;
    }
  }
}
